/**
 * 事件客户端的网络与单用户管理
 * 管理用户的登陆，以及在线状态的保持
 */
#pragma once

#include "ObjectArray.h"
#include "ServerHeader.h"

#include <sys/socket.h>

/* 事件客户端的网络功能 */
typedef struct _EventNetwork EventNetwork;
#define EVENT_NETWORK(any) ((EventNetwork *)any)

/* 程序唯一的网络对象（公用） */
extern EventNetwork *event_network;

extern EventNetwork *event_network_new(void);

/**
 * @brief 公用功能：验证地址是否有误
 * @param sock_addr 为 NULL 则只对地址作单独检测
 * @return 1: 成功，0: 地址无效，-1: 其他错误
 */
extern int event_network_check_address(const char      *address,
				       struct sockaddr *sock_addr);

/**
 * @brief 清除本地 OnlineID 缓存
 */
extern void event_network_clean_online_id(EventNetwork *self);

/**
 * @brief 设置服务器地址
 * @return 0: 成功，1: 出错
 */
extern int event_network_set_server_address(EventNetwork *self,
					    const char	 *address);

/**
 * @brief 设置手机号以及密码
 */
extern void event_network_set_phone_password(EventNetwork *self,
					     const char	  *phone_str,
					     const char	  *password);

/**
 * @brief 设置用户名
 */
extern void event_network_set_user_name(EventNetwork *self,
					const char   *user_name);

/**
 * @brief 设置验证码，若为 NULL 则取消验证码登陆
 */
extern void event_network_set_verification_code(EventNetwork *self,
						const char   *vcode);

/**
 * @brief 尝试登陆
 */
extern ResponseType event_network_try_logon(EventNetwork *self);

/**
 * @brief 尝试注册
 */
extern ResponseType event_network_try_register(EventNetwork *self);

/**
 * @brief 获取服务器登陆出错信息
 */
extern const char *event_network_get_error_info(EventNetwork *self);

/**
 * @brief 是否包含了默认的配置
 */
extern bool event_network_have_local_property(EventNetwork *self);

/**
 * @brief 获取电话号码
 */
extern const char *event_network_get_phone(EventNetwork *self);

/**
 * @brief 获取密码
 */
extern const char *event_network_get_password(EventNetwork *self);

/**
 * @brief 获取服务器 IP 地址
 */
extern const char *event_network_get_address(EventNetwork *self);

/**
 * @brief 获取服务器当前的返回状态
 */
extern ResponseType event_network_get_response_type(EventNetwork *self);

/**
 * @brief 拉取用户加入的的所有组条目
 */
extern ObjectArray *event_network_fetch_all_groups(EventNetwork *self);

/**
 * @brief 拉取用户的所有事件
 */
extern ObjectArray *event_network_fetch_all_events(EventNetwork *self);

/**
 * @brief 新增一条用户事件
 * @return 返回一条新增的事件，若为 0，则请查看 ResponseType 出错信息
 */
extern euint32 event_network_add_new_event(EventNetwork *self, euint32 group_id,
					   time_t      end_time,
					   const char *event_name,
					   const char *event_describe,
					   bool	       is_important);

/**
 * @brief 新增一条组信息，将返回新建的组 GroupID
 */
extern euint32 event_network_add_new_group(EventNetwork *self,
					   const char	*group_name,
					   bool writable, bool joinable);

/**
 * @brief 修改一条事件
 */
extern ResponseType event_network_modify_event(
	EventNetwork *self, euint32 group_id, euint32 event_id, eint64 end_time,
	const char *event_name, const char *event_describe, bool is_important);

/**
 * @brief 删除一条事件
 */
extern ResponseType event_network_remove_event(EventNetwork *self,
					       euint32	     group_id,
					       euint32	     event_id);

/**
 * @brief 加入某事件组
 * @return 返回一个 GroupName
 */
extern EventString *event_network_join_group(EventNetwork *self,
					     euint32	   group_id);

/**
 * @brief 以 PATH 初始化网络对象的所有本地信息
 */
extern void event_network_init_all(EventNetwork *self,
				   const char	*property_path);

/**
 * @brief 获取用户名
 */
extern const char *event_network_get_user_name(EventNetwork *self);

/**
 * @brief 退出事件组
 */
extern ResponseType event_network_quit_group(EventNetwork *self,
					     euint32	   group_id);

/**
 * @brief 修改事件组的名称
 */
extern ResponseType event_network_modify_group_name(EventNetwork *self,
						    euint32	  group_id,
						    const char	 *group_name);

/**
 * @brief 修改事件组的总可写标志
 */
extern ResponseType event_network_modify_g_can_write(EventNetwork *self,
						     euint32	   group_id,
						     bool	   g_can_write);

/**
 * @brief 修改事件组的可加入标志
 */
extern ResponseType event_network_modify_can_join(EventNetwork *self,
						  euint32	group_id,
						  bool		can_join);

/**
 * @brief 删除组
 */
extern ResponseType event_network_remove_group(EventNetwork *self,
					       euint32	     group_id);

/**
 * @brief 拉取组内所有用户信息
 */
extern ObjectArray *event_network_fetch_all_member_info(EventNetwork *self,
							euint32	      group_id);

/**
 * @brief 修改用户组内可写标志
 */
extern ResponseType event_network_modify_user_can_write(EventNetwork *self,
							euint32	      group_id,
							euint32	      user_id,
							bool can_write);
